﻿using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using AutoMapper;
using Castle.MicroKernel.Registration;
using Castle.Windsor;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Connection;
using NHibernate.Context;
using NHibernate.Dialect;
using NHibernate.Driver;
using music.domain.Model;
using music.web.Models.Shared;

namespace music.web
{
	// Note: For instructions on enabling IIS6 or IIS7 classic mode, 
	// visit http://go.microsoft.com/?LinkId=9394801

	public class MusicApplication : HttpApplication
	{
		public static readonly IWindsorContainer Container = new WindsorContainer();

		public static void RegisterGlobalFilters(GlobalFilterCollection filters)
		{
			filters.Add(new HandleErrorAttribute());
		}

		public static void RegisterRoutes(RouteCollection routes)
		{
			routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

			routes.MapRoute(
				"Default", // Route name
				"{controller}/{action}/{id}", // URL with parameters
				new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
			);

		}

		public void Init(string connectionStringName)
		{
			var config = new Configuration()
				.CurrentSessionContext<ManagedWebSessionContext>()
				.DataBaseIntegration(x =>
				                     	{
				                     		x.ConnectionProvider<DriverConnectionProvider>();
				                     		x.Driver<SqlClientDriver>();
				                     		x.ConnectionStringName = connectionStringName;
				                     		x.ConnectionReleaseMode = ConnectionReleaseMode.OnClose;
				                     		x.Dialect<MsSql2008Dialect>();
				                     	})
				.AddAssembly("music.domain");


			var sessionFactory = config.BuildSessionFactory();

			Container.Register(Component.For<ISessionFactory>().Instance(sessionFactory));

			Mapper.CreateMap<Song, SongModel>();
			Mapper.CreateMap<Comments, CommentModel>();
		}

		protected void Application_Start()
		{
			AreaRegistration.RegisterAllAreas();

			RegisterGlobalFilters(GlobalFilters.Filters);
			RegisterRoutes(RouteTable.Routes);
			Init("main");
		}
	}
}